// 基于tcp的客户端通信代码
#include <stdio.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>

int main()
{
    // 1、创建用于通信的套接字
    int fd = socket(AF_INET, SOCK_STREAM, 0);
    if (fd == -1)
    {
        perror("socket");
        return -1;
    }

    // 2、连接服务器IP端口
    struct sockaddr_in saddr;
    saddr.sin_family = AF_INET;
    saddr.sin_port = htons(9999);       // 转换成大端字节序（建议使用5000以上的端口号，5000以下的大部分端口号可能已经被操作系统或标准协议使用了）
    inet_pton(AF_INET, "192.168.27.129", &saddr.sin_addr.s_addr);
    int ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));

    if (ret == -1)
    {
        perror("connect");
        return -1;
    }

    // 3、通信
    int number = 0;
    while (1)
    {
        // 发送数据
        char buff[1024];
        sprintf(buff, "你好, hello, world, %d...\n", number++);
        send(fd, buff, strlen(buff) + 1, 0);

        // 接收数据
        memset(buff, 0, sizeof(buff)); // 先清空缓冲区
        int len = recv(fd, buff, sizeof(buff), 0);
        if (len > 0)
        {
            printf("server say: %s\n", buff);
        }
        else if (len == 0)
        {
            printf("服务器端已经断开了连接...\n");
            break;
        }
        else
        {
            perror("recv");
            break;
        }
        sleep(1);
    }

    // 4、关闭文件描述符
    close(fd);

    return 0;
}
